package com.cskaoyan.javase.oop1._8callby;

import sun.net.www.protocol.http.HttpURLConnection;

/**
 * 学习对象与类后，再复习一下如果方法的参数是需要一个对象，值传递是怎样进行的。
 *
 * 练习：
 * 定义一个学生类，该类具有一个int属性age
 * 1.在测试类中写一个方法，交换两个Student对象的age属性
 * 		请问能够交换成功吗？原因是什么？
 *
 * 2.在测试类中写一个方法，交换两个Student对象的引用（地址）
 * 		请问能够交换成功吗？原因是什么？
 *
 * 结论：
 * Java只有值传递
 * Java当中的方法可以改变对象的状态（成员变量的取值）但是无法直接交换两个引用（无法改变局部变量）
 *
 *
 * @since 11:19
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        Student s1 = new Student(18);
        Student s2 = new Student(81);

        /*swapStuAge(s1, s2);
         *//*
            Java的方法可以改变对象的状态
            可以修改对象中成员变量的取值
            所以交换年龄是可以成功的!
         *//*
        System.out.println(s1.age);
        System.out.println(s2.age);*/

        System.out.println(s1);
        System.out.println(s2);
        /*
            java的值传递,意味着java方法不能修改局部变量的取值
            局部变量包括基本数据类型变量,引用数据类型的引用
            所以这里的交换是失败
            但是在方法中交换拷贝,是交换成功的
         */
        swapStuReference(s1, s2);
        System.out.println(s1);
        System.out.println(s2);
    }

    public static void swapStuAge(Student s1, Student s2) {
        int temp = s1.age;
        s1.age = s2.age;
        s2.age = temp;
    }

    public static void swapStuReference(Student s1, Student s2) {
        Student temp = s1;
        s1 = s2;
        s2 = temp;
        System.out.println(s1);
        System.out.println(s2);
    }

}

class Student {
    int age;

    public Student() {
    }

    public Student(int age) {
        this.age = age;
    }
}
